{
"cells": [
{
"cell_type": "markdown",
"id": "d20164dd",
"metadata": {},
"source": [
"# Lineære transformationer\n",
"\n",
"Dette materiale er en tilpasset udgave af [Intermat 2.0 modul 1](https://intermat20.compute.dtu.dk/ct/Modul1_elever.html).\n",
"\n",
"Se evt. filen `spinning_cube.py` for perspektiv til hvordan emnet er relevant i 3D grafik."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "855b388d",
"metadata": {},
"outputs": [],
"source": [
"from gym_cas import *"
]
},
{
"cell_type": "markdown",
"id": "ded4ecc4",
"metadata": {},
"source": [
"\n",
"## Indledning\n",
"\n",
"Fra jeres sædvanlige matematikundervisning kender I funktioner:\n",
"\n",
"$$\n",
"f(x)=x^{2}, \\qquad x\\in\\mathbb{R}, \\qquad (f:\\mathbb{R}\\to \\mathbb{R}).\n",
"$$\n",
"\n",
"Det betyder at til en værdi $x\\in\\mathbb{R}$ finder vi en $y$-værdi $f(x)$. Hvis $x=3$, så er $f(3)=9$.\n",
"\n",
"Værdimængden for funktionen er\n",
"\n",
"$$\n",
"\\mathrm{Vm}(f)=[0,\\infty[ .\n",
"$$\n",
"\n",
"\n",
"\n",
"hvilket betyder, at ikke alle $y$-værdier kan rammes af en $x$-værdi.\n",
"\n",
">Overvej hvorfor?\n",
"\n",
">Har $f$ en invers funktion?\n",
"\n",
"Vi vil nu definere en særlig type funktioner, som tager vektorer, og hvor værdien også er vektorer. F.eks.\n",
"\n",
"$$f:\\mathbb{R}^{2}\\to\\mathbb{R}^{2}.$$\n",
"\n",
"Inden vi definerer disse nye funktioner, skal vi indføre et nyt begreb kaldet **matricer**.\n",
"\n",
"\n",
"\n",
"## Matricer\n",
"\n",
"### Eksempler\n",
"En reel $2\\times 2$ matrix er et skema med tal:\n",
"\n",
"$$\n",
"M_1 = \\begin{bmatrix} 1 & 2 \\\\ 3 & 4 \\end{bmatrix} \\qquad \\text{er en $2\\times 2$ matrix.}\n",
"$$\n",
"\n",
"\n",
"Et andet eksempel:\n",
"\n",
"$$\n",
"M_{2}=\\begin{bmatrix}1 & 2 & 3 \\\\ 4 & 5 & 6\\end{bmatrix}\\qquad\\text{er en }2\\times 3\\text{ matrix.}\n",
"$$\n",
"\n",
"\n",
"Vi taler om *søjler* og *rækker* i matricer. \n",
"\n",
"$M_{2}$ har 2 rækker: \n",
"\n",
"$$\n",
"\\begin{bmatrix} 1 & 2 & 3 \\end{bmatrix} \\quad \\text{er række 1,} \\qquad\n",
"\\begin{bmatrix} 4 & 5 & 6 \\end{bmatrix} \\quad \\text{er række 2.}\n",
"$$\n",
"\n",
"$M_{2}$ har 3 søjler: \n",
"\n",
"$$\n",
"\\begin{bmatrix} 1 \\\\ 4 \\end{bmatrix} \\quad \\text{er søjle 1,} \\qquad\n",
"\\begin{bmatrix} 2 \\\\ 5 \\end{bmatrix} \\quad \\text{er søjle 2,} \\qquad\n",
"\\begin{bmatrix} 3 \\\\ 6 \\end{bmatrix} \\quad \\text{er søjle 3.}\n",
"$$\n",
" \n",
"\n",
"\n",
"### Matrix-vektor produkt\n",
"Vi indfører nu et matrix-vektor produkt. \n",
"\n",
"$$\n",
"M =\n",
"\\begin{bmatrix}\n",
"\\text{---} & \\boldsymbol{r}_1 & \\text{---} \\\\\n",
"\\text{---} & \\boldsymbol{r}_2 & \\text{---} \\\\\n",
"&\\vdots \\\\\n",
"\\text{---} & \\boldsymbol{r}_m & \\text{---}\n",
"\\end{bmatrix}_{m \\text{ rækker}, \\; n \\text{ søjler}}\n",
"\\qquad\n",
"\\boldsymbol{v} =\n",
"\\begin{bmatrix}\n",
"v_{1} \\\\\n",
"v_{2} \\\\\n",
"\\vdots \\\\\n",
"v_{n}\n",
"\\end{bmatrix}_{n \\text{ rækker}, \\; 1 \\text{ søjle}}.\n",
"$$\n",
"\n",
"Her er $\\;\\boldsymbol{r}_1,\\dots,\\boldsymbol{r}_m\\;$ de $m$ rækker i $M$.\n",
"\n",
"$$\n",
"M\\boldsymbol{v} =\n",
"\\begin{bmatrix}\n",
"\\boldsymbol{r}_1 \\cdot \\boldsymbol{v} \\\\\n",
"\\boldsymbol{r}_2 \\cdot \\boldsymbol{v} \\\\\n",
"\\vdots \\\\\n",
"\\boldsymbol{r}_m \\cdot \\boldsymbol{v}\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
"\n",
"\n",
"hvor hver række består af det sædvanlige skalarprodukt mellem den tilsvarende række i $M$ og vektoren $\\boldsymbol{v}$.\n",
"\n",
"***Bemærk:*** Antallet af søjler i $M$ skal matche antallet af rækker i $\\boldsymbol{v}$.\n",
"\n",
"\n",
"\n",
"Betragt for eksempel matricen og vektoren\n",
"\n",
"$$\n",
"M=\\begin{bmatrix}1 & 2 \\\\ 3 & 4\\end{bmatrix}, \\qquad \\boldsymbol{v}=\\begin{bmatrix}-1 \\\\ 1\\end{bmatrix}.\n",
"$$\n",
"\n",
"Vi kan beregne produktet som\n",
"\n",
"$$\n",
"M \\boldsymbol{v} =\n",
"\\begin{bmatrix}\n",
"1 & 2 \\\\\n",
"3 & 4\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"-1 \\\\\n",
"1\n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"1\\cdot(-1)+2\\cdot 1 \\\\\n",
"3\\cdot(-1)+4\\cdot 1\n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"1 \\\\\n",
"1\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
"I python beregnes det som følgende."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "716f783e",
"metadata": {},
"outputs": [],
"source": [
"M = Matrix([[1,2],[3,4]])\n",
"v = vector(-1,1)\n",
"M * v"
]
},
{
"cell_type": "markdown",
"id": "e9e9c01e",
"metadata": {},
"source": [
"Lad os prøve. Betragt de fire følgende matrix-vektorpar:\n",
"\n",
"$$\n",
"M_{1} =\n",
"\\begin{bmatrix}\n",
"-1 & 0 \\\\\n",
"0 & 1\n",
"\\end{bmatrix},\n",
"\\quad\n",
"\\boldsymbol{v}_{1} =\n",
"\\begin{bmatrix}\n",
"2 \\\\\n",
"3\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
"$$\n",
"M_{2} =\n",
"\\begin{bmatrix}\n",
"1 & 0 & 2 \\\\\n",
"0 & -2 & 3\n",
"\\end{bmatrix},\n",
"\\quad\n",
"\\boldsymbol{v}_{2} =\n",
"\\begin{bmatrix}\n",
"2 \\\\\n",
"3\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
"$$\n",
"M_{3} =\n",
"\\begin{bmatrix}\n",
"1 & 0 & 2 \\\\\n",
"0 & -2 & 3\n",
"\\end{bmatrix},\n",
"\\quad\n",
"\\boldsymbol{v}_{3} =\n",
"\\begin{bmatrix}\n",
"-1 \\\\\n",
"-2 \\\\\n",
"3\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
"$$\n",
"M_{4} =\n",
"\\begin{bmatrix}\n",
"1 & 2 \\\\\n",
"3 & 0 \\\\\n",
"-1 & 4\n",
"\\end{bmatrix},\n",
"\\quad\n",
"\\boldsymbol{v}_{4} =\n",
"\\begin{bmatrix}\n",
"2 \\\\\n",
"3\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
">Prøv at udføre hver matrix-vektorprodukt i hånden, og afgør hvilken af de 4 der ikke kan udføres.\n",
"\n",
">Brug den følgende kodecelle til at se om du får det samme resultat i Python."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f0660cc2",
"metadata": {},
"outputs": [],
"source": [
"# Beregn matrix-vektorprodukterne her"
]
},
{
"cell_type": "markdown",
"id": "f9a9dae0",
"metadata": {},
"source": [
">Kan du lave en regel for antallet af rækker og søjler i produktet $M\\boldsymbol{v}$ ud fra kendskab til antallet af søjler og rækker i $M$ og $v$ hver især?\n",
"\n",
"\n",
"## Tilbage til funktioner\n",
"Vi vender nu tilbage til funktionerne.\n",
"Lad $A$ være en $2\\times 2$ matrix.\n",
"\n",
"### Lineær afbildning\n",
"Et eksempel på en lineær afbilding er\n",
"\n",
"$$\n",
"f : \\mathbb{R}^2 \\to \\mathbb{R}^2, \\qquad f(\\boldsymbol{v}) = A \\boldsymbol{v}.\n",
"$$\n",
"\n",
"Vi kan se, at det altid går godt: Enhver vektor $\\boldsymbol{v}\\in\\mathbb{R}^2$ kan ganges på en $2\\times 2$ matrix. \n",
"\n",
"Spørgsmålet er nu: Hvilke værdier kan funktionen antage? \n",
"(De ligger selvfølgelig i $\\mathbb{R}^2$.)\n",
"\n",
"Vi ved allerede, at vektoren\n",
"\n",
"$$\n",
"\\begin{bmatrix} 0 \\\\ 0 \\end{bmatrix}\n",
"$$\n",
"\n",
"altid ligger i værdimængden (som kaldes billedrummet).\n",
"\n",
"\n",
">Hvorfor?\n",
"\n",
"\n",
"Bemærk, at vi kan skrive\n",
"\n",
"$$\n",
"f(\\mathbf{v}) =\n",
"\\begin{bmatrix}\n",
"| & | \\\\\n",
"s_1 & s_2 \\\\\n",
"| & |\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"v_{1} \\\\\n",
"v_{2}\n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"| \\\\\n",
"s_{1} \\\\\n",
"|\n",
"\\end{bmatrix} v_{1}\n",
"+\n",
"\\begin{bmatrix}\n",
"| \\\\\n",
"s_{2} \\\\\n",
"|\n",
"\\end{bmatrix} v_{2},\n",
"$$\n",
"\n",
"hvor $s_1$ og $s_2$ er søjlerne i $A$.\n",
"\n",
"\n",
">Kan du forklare, hvorfor det gælder?\n",
"\n",
"Dette giver anledning til figuren, der dannes i følgende kodecelle."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "73e3e65f",
"metadata": {},
"outputs": [],
"source": [
"# --- input (experimenter med talværdierne her) ---\n",
"s1 = vector(1, 3) # første søjle\n",
"s2 = vector(2, 0.5) # anden søjle\n",
"v = vector(2,3) # input vektor\n",
"# ------------------------------------------\n",
"\n",
"f_v = v[0]*s1 + v[1]*s2\n",
"\n",
"# Tegner søjlevektorer\n",
"p1 = plot_vector([s1,s2],label=[\"\\\\vec{s_1}\",\"\\\\vec{s_2}\"],show=False) \n",
"\n",
"# Tegner søjleprodukterne\n",
"p2 = plot_vector([v[0]*s1,v[1]*s2],label=[\"v_1 \\\\vec{s_1}\",\"v_2 \\\\vec{s_2}\"],show=False)\n",
"\n",
"# Tegner f(v)\n",
"p3 = plot_vector(f_v,label=\"f(\\\\vec{v})\",show=False)\n",
"\n",
"# Tegner søjleprodukter i forlængelse af oprindelig søjleprodukter\n",
"p4 = plot_vector([v[0]*s1,v[1]*s2],[v[1]*s2,v[0]*s1],label=[\"v_1 \\\\vec{s_1}\",\"v_2 \\\\vec{s_2}\"],show=False)\n",
"( p3 + p2 + p1 + p4).show()"
]
},
{
"cell_type": "markdown",
"id": "a84402bf",
"metadata": {},
"source": [
">Forklar ud fra figuren hvorfor værdimængden enten er punktet $(0,0)$, en ret linje gennem origo, eller hele $\\mathbb{R}^2$.
*Vink*: Hvad sker der, hvis de to søjler er parallelle? Tjek evt. ved at ændre talværdierne for figuren.\n",
"\n",
"\n",
"### Opgave\n",
"Lad\n",
"\n",
"$$\n",
"A = \\begin{bmatrix}0 & 0 \\\\ 0 & 0\\end{bmatrix}, \\quad\n",
"B = \\begin{bmatrix}1 & 1 \\\\ -1 & 1\\end{bmatrix}, \\quad\n",
"C = \\begin{bmatrix}1 & -2 \\\\ -1 & 2\\end{bmatrix}\n",
"$$\n",
"\n",
"og\n",
"\n",
"$$\n",
"\\boldsymbol{v}_{1} = \\begin{bmatrix}1 \\\\ 1\\end{bmatrix}, \\quad \n",
"\\boldsymbol{v}_{2} = \\begin{bmatrix}-1 \\\\ 1\\end{bmatrix}.\n",
"$$\n",
"\n",
"Definér funktionerne $f_A(\\boldsymbol{v})=A\\boldsymbol{v}$, $f_B(\\boldsymbol{v})=B\\boldsymbol{v}$, $f_C(\\boldsymbol{v})=C \\boldsymbol{v}$.\n",
"\n",
"\n",
"\n",
">Opstil i følgende kodecelle matricerne $A,\\;B$ og $C$ samt vektorerne $\\boldsymbol{v}_1$ og $\\boldsymbol{v}_2$."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6d458110",
"metadata": {},
"outputs": [],
"source": [
"#"
]
},
{
"cell_type": "markdown",
"id": "c3b27828",
"metadata": {},
"source": [
">Bestem $f_{A}(v_{1})$, $f_{A}(v_{2})$, $f_{B}(v_{1})$, $f_{B}(v_{2})$, $f_{C}(v_{1})$ og $f_{C}(v_{2})$ og inspicer resultaterne fx vha. `display` i en notebook."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5473a0fb",
"metadata": {},
"outputs": [],
"source": [
"s1"
]
},
{
"cell_type": "markdown",
"id": "49d03938",
"metadata": {},
"source": [
">Juster koden nedenfor til at vise billedvektorerne i samme koordinatsystem."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "527075c6",
"metadata": {},
"outputs": [],
"source": [
"plot_vector([vector(1,0),vector(0,1)])"
]
},
{
"cell_type": "markdown",
"id": "1556ff76",
"metadata": {},
"source": [
">Prøv at beskrive *værdimængden* af de tre funktioner. Overvej hvilke vektorer i $\\mathbb{R}^2$, der kan rammes af $f_A$, $f_B$ og $f_C$ når $\\boldsymbol{v} \\in \\mathbb{R}^2$?\n",
"\n",
"\n",
"\n",
"### Rang\n",
"Vi vil introducere begrebet **rang** af en matrix.\n",
">Spørg din favorit-AI om begrebet *rang*.\n",
"\n",
"I Python kan rangen af en matrix beregnes med funktionen `Matrix.rank()`.\n",
"\n",
">Bestem $\\;\\text{rang}(A),\\;\\text{rang}(B)$ og $\\text{rang}(C)$."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5dc51a24",
"metadata": {},
"outputs": [],
"source": [
"#"
]
},
{
"cell_type": "markdown",
"id": "263b9887",
"metadata": {},
"source": [
"***Bemærk:*** Det er kun for funktionen $f_B$, at vi kan finde en invers funktion. \n",
">Hvorfor?\n",
"\n",
"\n",
"## Rotationer\n",
"\n",
"Vi betragter nu en særlig klasse af funktioner:\n",
"\n",
"$$\n",
"f(\\boldsymbol{v})=M\\boldsymbol{v},\\qquad M = \\begin{bmatrix}\\cos\\theta & -\\sin\\theta \\\\ \\sin\\theta & \\cos\\theta\\end{bmatrix}, \\qquad -\\pi \\le \\theta \\le \\pi.\n",
"$$\n",
"\n",
"$M$ drejer en vektor $\\boldsymbol{v}$, $\\theta$ radianer i positiv omløbsretning. I den følgende kodecelle drejer vi vektoren $\\boldsymbol{e}_1=\\begin{bmatrix} 1\\\\0\\end{bmatrix}$ med $\\frac{\\pi}{4}$ radianer ($45^{\\circ}$)."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6afc3ee2",
"metadata": {},
"outputs": [],
"source": [
"e1 = vector(1,0)\n",
"theta = pi/4\n",
"M = Matrix([[cos(theta), -sin(theta)],\n",
" [sin(theta), cos(theta)]])\n",
"plot_vector([e1,M * e1], label=[\"\\\\vec{e_1}\",\"M \\\\vec{e_1}\"])"
]
},
{
"cell_type": "markdown",
"id": "494b8d38",
"metadata": {},
"source": [
"### Opgave\n",
"Ud af følgende 5 matricer svarer nogle til en drejning som ovenfor. \n",
"\n",
"$$\n",
"M_{1}=\\begin{bmatrix}0 & -1 \\\\ 1 & 0\\end{bmatrix}, \\quad\n",
"M_{2}=\\begin{bmatrix}1 & 0 \\\\ 0 & 1\\end{bmatrix}, \\quad\n",
"M_{3}=\\begin{bmatrix}\\tfrac{1}{\\sqrt{2}} & -\\tfrac{1}{\\sqrt{2}} \\\\ \\tfrac{1}{\\sqrt{2}} & \\tfrac{1}{\\sqrt{2}}\\end{bmatrix},\n",
"$$\n",
"$$\n",
"M_{4}=\\begin{bmatrix}1 & -1 \\\\ 1 & 1\\end{bmatrix}, \\quad\n",
"M_{5}=\\begin{bmatrix}\\tfrac{1}{2} & \\tfrac{\\sqrt{3}}{2} \\\\ -\\tfrac{\\sqrt{3}}{2} & \\tfrac{1}{2}\\end{bmatrix}.\n",
"$$\n",
"\n",
">Hvilke gør det, og hvilken vinkel svarer de til?\n",
"\n",
">Prøv for hver af matricerne at indtegne en vektor $\\boldsymbol{v}$ og billedvektoren $f(\\boldsymbol{v})$ i samme koordinatsystem.
Ser vinklen ud til at passe?"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e5221c6b",
"metadata": {},
"outputs": [],
"source": [
"#"
]
},
{
"cell_type": "markdown",
"id": "b5be9d7d",
"metadata": {},
"source": [
"Vi kan med fordel definere en Python-funktion, der returnerer en rotationsmatrix for en given vinkel $\\theta$. \n",
">Færdiggør funktionen `rotation_matrix` i følgende kodecelle."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6543bf17",
"metadata": {},
"outputs": [],
"source": [
"def rotation_matrix(theta):\n",
" \"\"\"\n",
" Returnerer en 2D rotationsmatrix for en rotation med vinklen theta (i radianer).\n",
" \"\"\"\n",
" # EGEN KODE: Definer rotationsmatricen M\n",
" M =\n",
"\n",
" return M"
]
},
{
"cell_type": "markdown",
"id": "7446e2c1",
"metadata": {},
"source": [
"Med denne funktion kan vi nu definere en rotationsmatrix $M$ som `M=rotation_matrix(theta)`. \n",
">Afprøv din funktion ved at genskabe en af de fem matricer ovenfor ved hjælp af den vinkel, du har fundet."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cad094e1",
"metadata": {},
"outputs": [],
"source": [
"#"
]
},
{
"cell_type": "markdown",
"id": "34aaf7d0",
"metadata": {},
"source": [
"### Forklaring: hvorfor svarer $f$ til en drejning (kan evt. overspringes)\n",
"\n",
"En vektor $v$ kan opfattes som en længde og en retning, vi kan skrive \n",
"\n",
"$$\n",
"\\boldsymbol{v} =\n",
"|\\boldsymbol{v}|\\begin{bmatrix}\n",
"\\cos\\alpha \\\\\n",
"\\sin\\alpha\n",
"\\end{bmatrix},\n",
"$$\n",
"\n",
"hvor $\\alpha$ svarer til vinklen mellem vektoren og $x$-aksen (den positive retning). \n",
"\n",
"Prøv nu at udføre matrix-vektorproduktet: \n",
"\n",
"$$\n",
"M \\boldsymbol{v} = \n",
"|\\boldsymbol{v}|\\begin{bmatrix}\n",
"\\cos\\theta & -\\sin\\theta \\\\\n",
"\\sin\\theta & \\cos\\theta\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"\\cos\\alpha \\\\\n",
"\\sin\\alpha\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
"> Prøv at spørg din favorit-AI hvad *additionsformlerne* er for noget, \n",
"> og se om du ved hjælp af disse kan besvare spørgsmålet: \n",
"> Hvorfor svarer $f$ til en drejning på $\\theta$ radianer i positiv omløbsretning? \n",
"\n",
"> Hvordan kan det være, at $|\\boldsymbol{v}|$ kunne flyttes uden for selve matrixproduktet?"
]
},
{
"cell_type": "markdown",
"id": "0f853c9c",
"metadata": {},
"source": [
"## Matrix-matrix produkt\n",
"Vi definerer i lighed med matrix-vektor produktet et matrix-matrix produkt.\n",
"\n",
"Lad\n",
"\n",
"$$\n",
"M=\n",
"\\left[\n",
"\\begin{array}{cccc}\n",
"m_{11} & m_{12} & \\cdots & m_{1n}\\\\\n",
"m_{21} & m_{22} & \\cdots & m_{2n}\\\\\n",
"\\vdots & \\vdots & \\ddots & \\vdots\\\\\n",
"m_{m1} & m_{m2} & \\cdots & m_{mn}\n",
"\\end{array}\n",
"\\right]\n",
"\\qquad\n",
"\\begin{array}{l}\n",
"\\text{$n$ søjler}\\\\\n",
"\\text{$m$ rækker}\n",
"\\end{array}\n",
"$$\n",
"\n",
"og\n",
"\n",
"$$\n",
"N=\n",
"\\left[\n",
"\\begin{array}{cccc}\n",
"n_{11} & n_{12} & \\cdots & n_{1k}\\\\\n",
"\\vdots & \\vdots & \\ddots & \\vdots\\\\\n",
"n_{n1} & n_{n2} & \\cdots & n_{nk}\n",
"\\end{array}\n",
"\\right]\n",
"\\qquad\n",
"\\begin{array}{l}\n",
"\\text{$k$ søjler}\\\\\n",
"\\text{$n$ rækker}\n",
"\\end{array}\n",
"$$\n",
"\n",
"Da er\n",
"\n",
"$$\n",
"M\\,N =\n",
"\\left[\n",
"\\begin{array}{cccc}\n",
"\\alpha_{11} & \\alpha_{12} & \\cdots & \\alpha_{1k}\\\\\n",
"\\alpha_{21} & \\alpha_{22} & \\cdots & \\alpha_{2k}\\\\\n",
"\\vdots & \\vdots & \\ddots & \\vdots\\\\\n",
"\\alpha_{m1} & \\alpha_{m2} & \\cdots & \\alpha_{mk}\n",
"\\end{array}\n",
"\\right],\n",
"$$\n",
"\n",
"hvor $\\alpha_{ij}$ er lig skalarprodukt mellem række $i$ i $M$ og søjle $j$ i $N$.\n",
"\n",
">Får vi med matrix–matrixproduktet det samme som matrix–vektorproduktet i det særlige tilfælde, hvor $N$ kun har én søjle ($k=1$)?\n",
"\n",
"#### Eksempel\n",
"Betragt matrix-matrixproduktet\n",
"\n",
"$$\n",
"\\begin{bmatrix}\n",
"1 & 2\\\\\n",
"3 & 4\n",
"\\end{bmatrix}\n",
"\\begin{bmatrix}\n",
"1 & 0 & 2\\\\\n",
"-1 & 3 & 1\n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"-1 & 6 & 4\\\\\n",
"-1 & 12 & 10\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
">Kan du få de samme værdier i produktmatricen som i eksemplet?\n",
"\n",
">Verificer det ovenstående resultat i følgende kodecelle."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9edaf8e6",
"metadata": {},
"outputs": [],
"source": [
"#"
]
},
{
"cell_type": "markdown",
"id": "8d6eecea",
"metadata": {},
"source": [
"## Tilbage til rotationer\n",
"\n",
"### Opgave\n",
"> Brug den nedenstående kodecelle til at besvare opgaven. Angiv en $2\\times2$ matrix $M_{1}$ der roterer en vektor i positiv omløbsretning med $\\tfrac{\\pi}{4}$ radianer, \n",
"> og en anden $M_{2}$ der roterer en vektor i negativ omløbsretning med $\\tfrac{\\pi}{2}$ radianer:\n",
"> \n",
"> Vælg nu en vektor $v\\in\\mathbb{R}^{2}$.\n",
"> \n",
"> 1. Roter først vektoren ved hjælp af $M_1$:\n",
"> \n",
"> $$\n",
" \\boldsymbol{v}_1 = M_1 \\boldsymbol{v}.\n",
" $$\n",
"> \n",
"> 2. Roter derefter $v_1$ ved hjælp af $M_2$:\n",
"> \n",
"> $$\n",
" \\boldsymbol{v}_2 = M_2 \\boldsymbol{v}_1.\n",
" $$\n",
"> \n",
"> 3. (**Sammenlign**) Beregn også\n",
"> \n",
"> $$\n",
" \\boldsymbol{v}_2' = (M_2 M_1) \\boldsymbol{v}\n",
" $$\n",
"> \n",
"> og sammenlign $\\boldsymbol{v}_2'$ med $\\boldsymbol{v}_2$ (f.eks. i et plot eller ved brug af udskrivning).\n",
"> \n",
"> 4. Prøv at formulere i ord, hvad du ser!"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8ccbe378",
"metadata": {},
"outputs": [],
"source": [
"M1 = \n",
"M2 = \n",
"v ="
]
},
{
"cell_type": "markdown",
"id": "02722dd4",
"metadata": {},
"source": [
"### Sammensætning af rotationer forklaring (kan evt. overspringes)\n",
"Lad\n",
"\n",
"$$\n",
"M_{1}=\n",
"\\begin{bmatrix}\n",
"\\cos\\theta_{1} & -\\sin\\theta_{1}\\\\\n",
"\\sin\\theta_{1} & \\ \\cos\\theta_{1}\n",
"\\end{bmatrix}\n",
"\\qquad\\text{og}\\qquad\n",
"M_{2}=\n",
"\\begin{bmatrix}\n",
"\\cos\\theta_{2} & -\\sin\\theta_{2}\\\\\n",
"\\sin\\theta_{2} & \\ \\cos\\theta_{2}\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
"være to rotationsmatricer.\n",
"\n",
">Udregn $M_{1}M_{2}$ i hånden.\n",
"\n",
">Brug nu additionsformlerne fra tidligere til at vise, at $M_{1}M_{2}$ har samme virkning som en rotation med vinklen $\\theta_{1}+\\theta_{2}$ på en vilkårlig vektor i $\\mathbb{R}^{2}$.\n",
"\n",
"\n",
"### Eksempel: Refleksion\n",
"\n",
"Betragt matricen\n",
"\n",
"$$\n",
"M =\n",
"\\begin{bmatrix}\n",
"0 & 1 \\\\\n",
"1 & 0\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"og lad $f$ være funktionen $f(\\boldsymbol{v}) = M \\boldsymbol{v}$.\n",
"\n",
">Prøv med forskellige vektorer $\\boldsymbol{v}$ at finde billedvektoren $f(\\boldsymbol{v})$.
Hvilken virkning har matricen $M$ på en vektor?\n",
"\n",
"Bemærk at virkningen af $M$ ikke svarer til en rotation i positiv omløbsretning som beskrevet ovenfor,\n",
"det vil sige $M$ kan ikke bringes på formen\n",
"\n",
"$$\n",
"\\begin{bmatrix}\n",
"\\cos\\theta & -\\sin\\theta \\\\\n",
"\\sin\\theta & \\cos\\theta\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
">Hvorfor ikke?\n",
"\n",
"Virkningen af $M$ på vektoren $\\boldsymbol{v}$ kaldes en refleksion, \n",
"(i dette tilfælde en refleksion i linjen udspændt af vektoren \n",
"$\\boldsymbol{w} = (1,1)$ ).\n",
"\n",
"\n",
"## Invers matrix\n",
"\n",
"Vi betragter igen en rotation, givet ved\n",
"\n",
"$$\n",
"M =\n",
"\\begin{bmatrix}\n",
"\\cos\\theta & -\\sin\\theta \\\\\n",
"\\sin\\theta & \\cos\\theta\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
"$M$ roterer altså $\\boldsymbol{v}$, $\\theta$ radianer i positiv omløbsretning.\n",
"\n",
"Betragt nu den rotationsmatrix der roterer en vektor $\\boldsymbol{v}$, $\\theta$ radianer i negativ omløbsretning:\n",
"\n",
"$$\n",
"M^{-1} =\n",
"\\begin{bmatrix}\n",
"\\cos(-\\theta) & -\\sin(-\\theta) \\\\\n",
"\\sin(-\\theta) & \\cos(-\\theta)\n",
"\\end{bmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"\\cos\\theta & \\sin\\theta \\\\\n",
"-\\sin\\theta & \\cos\\theta\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
">Forklar hvorfor de to ovennævnte matricer netop ser ud som de gør. \n",
"\n",
"Det er klart ud fra definitionen på $M$ og $M^{-1}$, at\n",
"\n",
"$$\n",
"M^{-1}(M\\boldsymbol{v}) = M(M^{-1}\\boldsymbol{v}) = \\boldsymbol{v}.\n",
"$$\n",
"\n",
">Prøv med forskellige forskellige vinkler og vektorer at eftervise ovenstående identiteter. \n",
"\n",
">Prøv nu med de samme vinkler at udregne matrix-matrixprodukterne $M^{-1}M$ og $MM^{-1}$.
Hvad ser du?\n",
"\n",
"Vi kalder \n",
"\n",
"$$\n",
"\\begin{bmatrix}\n",
"1 & 0 \\\\\n",
"0 & 1\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"identitetsmatricen $I$. \n",
">Hvilken virkning har den på en vektor?\n",
"\n",
"Vi siger at en matrix $M$ med lige antal søjler og rækker har en invers matrix\n",
"hvis der findes en matrix $M^{-1}$ med egenskaben\n",
"\n",
"$$\n",
"M^{-1}M = MM^{-1} = I.\n",
"$$\n",
"\n",
"\n",
"\n",
"## Diagonal matrix\n",
"En matrix på formen\n",
"\n",
"$$\n",
"D =\n",
"\\begin{bmatrix}\n",
"m_{11} & 0 & 0 & \\cdots & 0 \\\\\n",
"0 & m_{22} & 0 & \\cdots & 0 \\\\\n",
"0 & 0 & \\ddots & \\ddots & 0 \\\\\n",
"\\vdots & \\vdots & \\ddots & \\ddots & \\vdots \\\\\n",
"0 & 0 & 0 & \\cdots & m_{nn}\n",
"\\end{bmatrix},\n",
"$$\n",
"\n",
"hvor kun diagonalelementerne er forskellige fra nul (bemærk at vi kalder diagonalen \n",
"den linje, der går fra øverste venstre hjørne til nederste højre hjørne i matricen).\n",
"\n",
">Identitetsmatricen er en diagonalmatrix – hvorfor?\n",
"\n",
"Betragt de fire følgende eksempler på $2\\times 2$ diagonalmatricer:\n",
"\n",
"$$\n",
"D_{1} =\n",
"\\begin{bmatrix}\n",
"-1 & 0 \\\\\n",
"0 & 1\n",
"\\end{bmatrix}, \\quad\n",
"D_{2} =\n",
"\\begin{bmatrix}\n",
"2 & 0 \\\\\n",
"0 & 3\n",
"\\end{bmatrix}, \\quad\n",
"D_{3} =\n",
"\\begin{bmatrix}\n",
"\\frac{1}{2} & 0 \\\\\n",
"0 & \\frac{1}{3}\n",
"\\end{bmatrix}, \\quad\n",
"D_{4} =\n",
"\\begin{bmatrix}\n",
"0 & 0 \\\\\n",
"0 & 2\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
">Prøv at finde den inverse matrix (hvis muligt) til de fire diagonalmatricer.\n",
"\n",
"Matricen\n",
"\n",
"$$\n",
"V =\n",
"\\begin{bmatrix}\n",
"0 & -1 \\\\\n",
"\\frac{1}{2} & 0\n",
"\\end{bmatrix}\n",
"$$\n",
"\n",
"er ikke en diagonalmatrix. \n",
"\n",
">Hvorfor ikke?\n",
"\n",
">Kan du finde en invers til $V$? \n",
"\n",
"For at se virkningen af en diagonalmatrix på en vektor $\\boldsymbol{v}$ betragter vi nu igen funktionen\n",
"\n",
"$$\n",
"f(\\boldsymbol{v}) = N_i \\boldsymbol{v},\n",
"$$\n",
"\n",
"hvor\n",
"\n",
"$$\n",
"N_{1} =\n",
"\\begin{bmatrix}\n",
"1 & 0 \\\\\n",
"0 & 1\n",
"\\end{bmatrix}, \\quad\n",
"N_{2} =\n",
"\\begin{bmatrix}\n",
"2 & 0 \\\\\n",
"0 & 2\n",
"\\end{bmatrix}, \\quad\n",
"N_{3} =\n",
"\\begin{bmatrix}\n",
"1 & 0 \\\\\n",
"0 & 2\n",
"\\end{bmatrix}, \\quad\n",
"N_{4} =\n",
"\\begin{bmatrix}\n",
"0 & 1 \\\\\n",
"-1 & 0\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
">Beregn $f(\\boldsymbol{v})$ i disse 4 tilfælde, brug forskellige $\\boldsymbol{v}$'er."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ef5f836e",
"metadata": {},
"outputs": [],
"source": [
"#"
]
},
{
"cell_type": "markdown",
"id": "46ae3dcc",
"metadata": {},
"source": [
">Kan du forklare virkningen på en vektor $\\boldsymbol{v}$ i de 4 tilfælde?\n",
"\n",
"\n",
"### Sammensætning af rotationer og diagonalmatricer\n",
"\n",
"Vi betragter igen de 4 matricer ovenfor. \n",
"Lad $M$ være matricen\n",
"\n",
"$$\n",
"M =\n",
"\\begin{bmatrix}\n",
"\\cos\\left(\\tfrac{\\pi}{4}\\right) & -\\sin\\left(\\tfrac{\\pi}{4}\\right) \\\\\n",
"\\sin\\left(\\tfrac{\\pi}{4}\\right) & \\cos\\left(\\tfrac{\\pi}{4}\\right)\n",
"\\end{bmatrix}.\n",
"$$\n",
"\n",
">Udregn nu $M^{-1}N_iM$ og forklar resultatet ved hjælp af et plot."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d5b444f2",
"metadata": {},
"outputs": [],
"source": [
"#"
]
},
{
"cell_type": "markdown",
"id": "c73ec6ce",
"metadata": {},
"source": [
"> Gælder der samme regler som for tal, at faktorernes orden er ligegyldig, altså er det korrekt at: \n",
">\n",
"> $$\n",
" M^{-1}N_iM = N_iM^{-1}M = N_i I = N_i \\, ?\n",
" $$\n",
">\n",
"> Hvis ikke det gælder generelt, er det så altid forkert?\n",
"\n",
"\n",
"\n",
"## Drejning af koordinatsystem og skift af koordinater\n",
"\n",
"Vi betragter nu to koordinatsystemer, vores sædvanlige $x$-$y$ koordinatsystem og så et nyt drejet $x'$-$y'$ koordinatsystem. Figuren genereres ved at køre følgende kodecelle."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ad843d07",
"metadata": {},
"outputs": [],
"source": [
"# Rotationsvinkel\n",
"theta = pi / 6 \n",
"\n",
"# Akse definitioner\n",
"x_axis = vector(1, 0)\n",
"y_axis = vector(0, 1)\n",
"x_prime = vector(cos(theta), sin(theta))\n",
"y_prime = vector(-sin(theta), cos(theta))\n",
"\n",
"# Vektoren v\n",
"v = vector(cos(pi/4), sin(pi/4))\n",
"\n",
"p1 = plot_vector([x_axis,y_axis],rendering_kw={\"color\": \"red\"}, xlim=(-0.5,1),label=[\"x\",\"y\"],show=False)\n",
"p2 = plot_vector([x_prime,y_prime],rendering_kw={\"color\": \"blue\"},label=[\"x'\",\"y'\"],show=False)\n",
"p3 = plot_vector(v,rendering_kw={\"color\": \"black\"},label=\"v\",show=False)\n",
"(p1+p2+p3).show()\n"
]
},
{
"cell_type": "markdown",
"id": "3a1e8cca",
"metadata": {},
"source": [
"Opgaven er nu, hvis vi kender koordinaterne for $\\boldsymbol{v}$ i det sædvanlige koordinatsystem,\n",
"at finde koordinaterne i det drejede koordinatsystem og omvendt.\n",
"\n",
"---\n",
"\n",
"Først et let eksempel: Lad os dreje $x'$-$y'$-koordinatsystemet \n",
"$\\tfrac{\\pi}{2}$ radianer i forhold til $x$-$y$-koordinatsystemet."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "906ba0c1",
"metadata": {},
"outputs": [],
"source": [
"# Rotationsvinkel\n",
"theta = pi / 2 \n",
"\n",
"# Akse definitioner\n",
"x_axis = vector(2, 0)\n",
"y_axis = vector(0, 2)\n",
"x_prime = 2*vector(cos(theta), sin(theta))\n",
"y_prime = 2*vector(-sin(theta), cos(theta))\n",
"\n",
"# Vektoren v\n",
"v = sqrt(2)*vector(cos(pi/4), sin(pi/4))\n",
"\n",
"p1 = plot_vector([x_axis,y_axis],rendering_kw={\"color\": \"red\",\"linewidth\": 3}, xlim=(-2,2),label=[\"x\",\"y\"],show=False)\n",
"p2 = plot_vector([x_prime,y_prime],rendering_kw={\"color\": \"blue\"},label=[\"x'\",\"y'\"],show=False)\n",
"p3 = plot_vector(v,rendering_kw={\"color\": \"black\"},label=\"v\",show=False)\n",
"(p1+p2+p3).show()"
]
},
{
"cell_type": "markdown",
"id": "e5ad85d7",
"metadata": {},
"source": [
"Koordinaterne for $\\boldsymbol{v}$ med hensyn til $x$-$y$-koordinatsystemet er \n",
"\n",
"$$\n",
"(1,1).\n",
"$$\n",
"\n",
"Koordinaterne for $\\boldsymbol{v}$ med hensyn til $x'$-$y'$-koordinatsystemet er \n",
"\n",
"$$\n",
"(1,-1).\n",
"$$\n",
"\n",
">Forklar hvorfor, brug figuren.\n",
"\n",
"---\n",
"\n",
"Nu vender vi tilbage til det oprindelige problem.\n",
"\n",
"Lad os sige, at koordinaterne for $\\boldsymbol{v}$ med hensyn til $x'$-$y'$-koordinatsystemet er \n",
"\n",
"$$\n",
"(v_1',v_2'),\n",
"$$\n",
"\n",
"Forestil jer nu, at de to koordinatsystemer er sammenfaldende til at starte med,\n",
"og vi så begynder at dreje $x'$-$y'$-koordinatsystemet $\\theta$ radianer i positiv omløbsretning\n",
"med vektoren $\\boldsymbol{v}$ fastholdt til $x'$-$y'$-koordinatsystemet. \n",
"\n",
"Dette svarer til at dreje vektoren $\\boldsymbol{v}$ $\\theta$ radianer, så koordinaterne i $x$-$y$-koordinatsystemet er\n",
"\n",
"$$\n",
"\\begin{pmatrix} \n",
"x \\\\[0.3em] \n",
"y \n",
"\\end{pmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"\\cos\\theta & -\\sin\\theta \\\\\n",
"\\sin\\theta & \\cos\\theta\n",
"\\end{bmatrix}\n",
"\\begin{pmatrix}\n",
"x' \\\\[0.3em] y'\n",
"\\end{pmatrix}.\n",
"$$\n",
"\n",
"Drejningen den modsatte vej er givet ved\n",
"\n",
"$$\n",
"\\begin{pmatrix} x'\\\\[0.2em] y' \\end{pmatrix}\n",
"=\n",
"\\begin{bmatrix}\n",
"\\cos\\theta & \\sin\\theta\\\\\n",
"-\\sin\\theta & \\cos\\theta\n",
"\\end{bmatrix}\n",
"\\begin{pmatrix} x\\\\[0.2em] y \\end{pmatrix}.\n",
"$$\n",
"\n",
">Forklar hvorfor! \n",
"\n",
"Vi kalder de to indgående matricer for koordinatskiftematricer.\n",
"\n",
"---\n",
"\n",
"**Opgave**\n",
"\n",
"Vælg nu en drejningsvinkel på $\\tfrac{\\pi}{4}$ radianer.\n",
"\n",
"1. Betragt en vektor $\\boldsymbol{v}$ med koordinater\n",
"\n",
"$$\n",
"\\begin{pmatrix} x \\\\ y \\end{pmatrix}\n",
"=\n",
"\\begin{pmatrix} 1 \\\\ 2 \\end{pmatrix}.\n",
"$$\n",
"\n",
">Find $x'$-$y'$-koordinaterne."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7d64a79d",
"metadata": {},
"outputs": [],
"source": [
"#"
]
},
{
"cell_type": "markdown",
"id": "bb2abe56",
"metadata": {},
"source": [
"2. Betragt en vektor $\\boldsymbol{w}'$ med koordinater\n",
"\n",
"$$\n",
"\\begin{pmatrix} x' \\\\ y' \\end{pmatrix}\n",
"=\n",
"\\begin{pmatrix} \\sqrt{2} \\\\ \\sqrt{2} \\end{pmatrix}.\n",
"$$\n",
"\n",
">Find $x$-$y$-koordinaterne."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "84e1430c",
"metadata": {},
"outputs": [],
"source": [
"#"
]
},
{
"cell_type": "markdown",
"id": "20d72d82",
"metadata": {},
"source": [
"3. Lad os prøve at visualisere denne drejning. I følgende kodecelle genereres to koordinatsystemer i hhv. $(x,y)$- og $(x',y')$-koordinater.\n",
"\n",
">Foretag ændringer i plottet, så vi får følgende: \n",
"> * I ($x,y$)-koordinatsystem vises vektorerne $\\boldsymbol{v}$ og $\\boldsymbol{w}$.\n",
"> * I ($x',y'$)-koordinatsystem vises vektorerne $\\boldsymbol{v}'$ og $\\boldsymbol{w}'$.\n",
"> * $\\boldsymbol{v}$ og $\\boldsymbol{v}'$ er plottet med samme farve, mens $\\boldsymbol{w}$ og $\\boldsymbol{w}'$ har en anden fælles farve."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7b9ac411",
"metadata": {},
"outputs": [],
"source": [
"from spb import plotgrid\n",
"\n",
"# Rotationsvinkel\n",
"theta = pi / 4\n",
"\n",
"# Akse definitioner\n",
"x_axis = vector(2, 0)\n",
"y_axis = vector(0, 2)\n",
"x_prime = 2 * vector(cos(theta), sin(theta))\n",
"y_prime = 2 * vector(-sin(theta), cos(theta))\n",
"\n",
"# venstre subplot (x-y koordinatsystem) ----------------------------\n",
"left_1 = plot_vector(\n",
" [x_prime, y_prime],\n",
" rendering_kw={\"color\": \"black\"},\n",
" label=[\"x'\", \"y'\"],\n",
" xlim=(-1.5, 2.5),\n",
" ylim=(-1, 2.5),\n",
" axis_center=(0, 0),\n",
" title=\"($x$, $y$) koordinatsystem\",\n",
" show=False,\n",
")\n",
"\n",
"# EGEN KODE: plotter vektorerne v og w (x-y koordinater) i stedet for\n",
"left_2 = plot_vector(vector(1, 1 / 2), label=[\"v\"], show=False)\n",
"\n",
"# højre subplot (x'-y' koordinatsystem) ----------------------------\n",
"# EGEN KODE: plotter vektorerne v' og w' (x'-y' koordinater) i stedet for\n",
"right_1 = plot_vector(\n",
" vector(1, 1 / 2),\n",
" xlim=(-1.5, 2.5),\n",
" ylim=(-1, 2.5),\n",
" axis_center=(0, 0),\n",
" title=\"($x'$, $y'$) koordinatsystem\",\n",
" show=False,\n",
")\n",
"\n",
"plotgrid(left_1 + left_2, right_1, nr=1)\n"
]
}
],
"metadata": {
"jupytext": {
"formats": "ipynb,md:myst",
"text_representation": {
"extension": ".md",
"format_name": "myst",
"format_version": 0.13,
"jupytext_version": "1.16.0"
}
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.0"
},
"source_map": [
13,
21,
24,
169,
173,
239,
241,
308,
348,
375,
377,
381,
383,
387,
413,
417,
420,
434,
436,
452,
458,
477,
479,
484,
493,
498,
500,
621,
623,
657,
661,
877,
879,
899,
901,
917,
963,
973,
1018,
1097,
1099,
1112,
1114,
1126
]
},
"nbformat": 4,
"nbformat_minor": 5
}